dexterity: rng.gen::<u8>(),
hitpoints: rng.gen::<u8>()
});
cookies.add(Cookie::new("character_id".into(), new_character_id));
cookies.add(Cookie::new("throttle", get_time().sec.to_string()));
Ok(Redirect::to("/game"))
}
#[get("/game")]
fn game(state: GameState, flash: Option<FlashMessage>) -> Template {
let players = state.players.clone();
let characters = players.lock().unwrap();
let flash: String = match flash {
Some(f) => f.msg().into(),
None => "".into()
};
let g_v_d = GameViewData { flash: flash, characters: characters.clone() };
Template::render("game", &g_v_d)
}
#[post("/attack/<id>")]
fn attack(cookies: &Cookies, state: GameState, id: &str) -> Flash<Redirect> {
let ref mut players = *state.players.lock().unwrap();
let throttle: i64 =
cookies.find("throttle").unwrap().value().parse().unwrap();
println!("throttle is {}, current time is {}", throttle, get_time().sec);
if throttle >= get_time().sec {
return Flash::error(Redirect::to("/game"), "Attacking too fast!");
}
let attacker_cookie = cookies.find("character_id").unwrap();
let attacker_id = cookies.find("character_id").unwrap().value;
let attacker = players.get(&attacker_id).unwrap().clone();
let defender = players.get(id).unwrap().clone();
let mut rng = rand::thread_rng();
let damage: i16 = attacker.strength as i16 - defender.dexterity as i16 +
rng.gen::<i8>() as i16;
let message = if damage < 1 {
format!("{} missed {}", attacker.name, defender.name)
} else if defender.hitpoints as i16 - damage < 1 {
players.remove(id);
format!("{} hits {}. {} is slain!", attacker.name, defender.name,
defender.name)
} else {
let new_defender = Character {
name: defender.name.clone(),
strength: defender.strength,
dexterity: defender.dexterity,
hitpoints: defender.hitpoints - damage as u8
};
players.insert(id.into(), new_defender);
format!("{} hits {}.", attacker.name, defender.name)
};
Flash::error(Redirect::to("/game"), message)
}